package com.xaicode.auth.security.domain;

import cn.hutool.http.HttpStatus;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import static cn.hutool.http.HttpStatus.HTTP_OK;

/**
 * 返回值包装类
 * <p>
 * 本类强依赖于 common-core 中的 Result 类，
 * 此处独立创建是为了省略对 common-core 的依赖，
 * 对前端返回时必须严格匹配字段。
 * 
 * @date 2025/1/7
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SatokenResult<T> {

    private static final String MSG_OK = "操作成功";
    private static final String MSG_FAIL = "操作失败";

    /**
     * 网络请求响应码
     */
    private long code = HTTP_OK;

    /**
     * 后台操作响应信息
     */
    private String message = MSG_OK;

    /**
     * 自定义返回数据
     */
    private T data;


    // ----


    /**
     * @return <pre>{@code
     * code=500
     * message=fail
     * data=null
     * }</pre>
     */
    @JsonIgnore
    public static <T> SatokenResult<T> fail() {
        return fail(MSG_FAIL, null);
    }

    /**
     * @param message .
     * @param <T>     T
     * @return <pre>{@code
     * code=500
     * message=xxx
     * data=null
     * }</pre>
     */
    @JsonIgnore
    public static <T> SatokenResult<T> fail(String message) {
        return fail(HttpStatus.HTTP_INTERNAL_ERROR, message, null);
    }

    /**
     * @param code    http code
     * @param message msg
     * @return <pre>{@code
     * code=code
     * message=message
     * data=null
     * }</pre>
     */
    @JsonIgnore
    public static <T> SatokenResult<T> fail(long code, String message) {
        return fail(code, message, null);
    }

    /**
     * @param t       T
     * @param <T>     T
     * @param message msg
     * @return <pre>{@code
     * code=500
     * message=message
     * data=t
     * }</pre>
     */
    @JsonIgnore
    public static <T> SatokenResult<T> fail(String message, T t) {
        return fail(HttpStatus.HTTP_INTERNAL_ERROR, message, t);
    }

    /**
     * @param code    http code
     * @param t       T
     * @param <T>     T
     * @param message msg
     * @return <pre>{@code
     * code=code
     * message=message
     * data=t
     * }</pre>
     */
    @JsonIgnore
    public static <T> SatokenResult<T> fail(long code, String message, T t) {
        SatokenResult<T> satokenResult = new SatokenResult<>();
        satokenResult.setCode(code);
        satokenResult.setMessage(message);
        satokenResult.setData(t);
        return satokenResult;
    }

}
